package main

import (
	"fmt"
	"time"
)

/**
channel 的作用：
相当于一个管道，在获取channel的值时，如果channel为空，那么会进入阻塞状态
ch <- 666 这是给channel赋值,叫做发送数据
<- ch 这叫做接受数据

下边例子实现有序打印的原理是：
print1 和 print2 是分别被两个协程调用的，不加任何措施，他们会出现资源竞争的问题，导致两边都在调用打印函数，从而出现打印环混乱，
我们在print1里执行完打印时加了个发送数据的，在print2里开头加了个接受数据的，这时，如果print1先被调用，那么print2在调用时，由于要先获取channel的数据，而此时print1还有没有给发送数据，所以print2就进入了阻塞状态，只有等print1打印完，发送数据，print2才会执行，这样就避免了打印混乱
 */
//全局变量创建一个channel
var ch = make(chan int)

//定义一个公共的打印方法
func printer(s string)  {
	for _, val := range s{
		fmt.Printf("%c", val)
		time.Sleep(time.Second)
	}
}

//定义两个协程调用公共的打印方法
func print1() {
	printer("hello")
	ch <- 666
}
func print2() {
	<- ch
	printer("world")
}

func main()  {
	//如果两个协程同时去使用打印函数，会导致打印混乱
	go print1()
	go print2()

	for {
		time.Now()
	}
}
